package com.tony.juc;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * Created with IntelliJ IDEA.
 *
 * @Title: ThreadLocalRandomDemo001
 * @Auther: 皮蛋布丁
 * @Date: 2022/04/06/22:06
 * @Description: 随机数
 */
public class ThreadLocalRandomDemo001 {

    public static void main(String[] args) {

        Random random = new Random(); // 定义一个随机数的处理类

        /*for (int i = 0; i < 3; i++) {
            new Thread(()->{
                System.out.printf("【%s】生成随机数：%d%n", Thread.currentThread().getName(), random.nextInt(100));
            },"随机数生成线程-" + i).start();
        }*/

        /*for (int i = 0; i < 3; i++) {
            new Thread(()->{
                for (int j = 0; j < 3; j++) {
                    System.out.printf("【%s】〖%d〗生成随机数：%d%n", Thread.currentThread().getName(), j, random.nextInt(100));
                }
            },"随机数生成线程-" + i).start();
        }*/

        for (int i = 0; i < 3; i++) {
            new Thread(()->{
                for (int j = 0; j < 3; j++) {
                    System.out.printf("【%s】〖%d〗生成随机数：%d%n", Thread.currentThread().getName(), j,
                            ThreadLocalRandom.current().nextInt(100));
                }
            },"随机数生成线程-" + i).start();
        }

        //所有线程都访问同一个Random时，会共享同一个随机因子的数据，而随机因子时用于控制随机数生成的
        //相比较Random，ThreadLocalRandom可以针对每一个不同的线程保存各自的因子，从而实现准确的随机数随机因子，这种机制等同于每一个线程保存一个Random

        //剖析Random中nextInt()中的next()
        /*protected int next(int bits) {
            long oldseed, nextseed;
            AtomicLong seed = this.seed;    //考虑到了多线程的同步，所以每次只能够生成一个随机因子
            do {
                oldseed = seed.get();   //获取已经存在的随机因子
                nextseed = (oldseed * multiplier + addend) & mask;  //计算下一个随机因子
            } while (!seed.compareAndSet(oldseed, nextseed));   //CAS替换
            return (int)(nextseed >>> (48 - bits));
        }*/


    }
}
